home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Screensaver / Ultimate Screen Savers Collection (CMS Distributing) (1996).ISO / saver3 / xwsave1 / galaxy.c < prev    next >
C/C++ Source or Header  |  1994-10-23  |  12KB  |  341 lines

  1. #ifndef lint  
  2. static char sccsid[] = "@(#)galaxy.c     1.14 94/09/30 XLOCK";   
  3. #endif
  4. /*
  5.  * galaxy.c - Spinning galaxies for xlockmore
  6.  *
  7.  * Originally done by Uli Siegmund (uli@wombat.okapi.sub.org) on Amiga
  8.  *   for EGS in Cluster
  9.  * Port from Cluster/EGS to C/Intuition by Harald Backert
  10.  * Port to X11 and incorporation into xlockmore by Hubert Feyrer
  11.  *   (hubert.feyrer@rz.uni-regensburg.de)
  12.  *
  13.  * Revision History:
  14.  * 30-Sep-94: Initial port by Hubert Feyer
  15.  * 10-Oct-94: Add colors by Hubert Feyer
  16.  * 23-Oct-94: Modified by David Bagley <bagleyd@source.asset.com>
  17.  */
  18.  
  19. #include <math.h>
  20. #include <stdlib.h>
  21. #include "xlock.h"
  22.  
  23. #define FLOATRAND ((double) random() / ((double) MAXRAND))
  24.  
  25. #ifndef STARSIZE
  26. #define STARSIZE 1      /* Size of STARS */
  27. #endif
  28. /*#define WRAP       1    *//* Warp around edges */
  29. /*#define BOUNCE     1    *//* Bounce from borders */
  30.  
  31. #define MAX_GALAXIES        5
  32. #define MAX_STARS        300
  33. #define MAX_HITITERATIONS    200
  34. #define MAX_IDELTAT        50
  35. /* These come originally from the Cluster-version */
  36. #define DEFAULT_GALAXIES    2
  37. #define DEFAULT_STARS        1000
  38. #define DEFAULT_HITITERATIONS    7500
  39. #define DEFAULT_IDELTAT        200     /* 0.02 */
  40.  
  41. #define GALAKSIZE    3.0
  42. #define QCONS        0.001
  43.  
  44. #define COLOROFFSET    0        /* I hate green galaxies */
  45. #define MAXCOLORS 64
  46. #define COLORBASE    8
  47.     /* Colors for stars start here */
  48. #define COLORSTEP    (MAXCOLORS/COLORBASE)    /* 8 colors per galaxy */
  49.  
  50. #ifndef PI
  51. #  define PI M_PI
  52. #endif /*PI*/
  53.  
  54. #if (STARSIZE > 1)
  55. #  define MyXDrawPoint(x,y) \
  56.             XFillArc(dsp,win,Scr[screen].gc,x,y,gp->starsize,gp->starsize,0*64,360*64)
  57. #else
  58. #  define MyXDrawPoint(x,y) \
  59.             XDrawPoint(dsp,win,Scr[screen].gc,x,y)
  60. #endif /*STARSIZE*/
  61.  
  62.  
  63. typedef double Vector[3];
  64. typedef double Matrix[3][3];
  65.  
  66. typedef struct {
  67.     Vector pos, vel;
  68.     int px, py;
  69.     int color;
  70.     } Star;
  71. typedef struct {
  72.     int mass;
  73.     int starscnt;
  74.     Star *stars;
  75.     int basecolor;
  76.     Vector pos, vel;
  77.     } Galaxy;
  78.  
  79. typedef struct {
  80.     struct {
  81.     int left;                             /* x minimum */
  82.     int right;                            /* x maximum */
  83.     int top;                              /* y minimum */
  84.     int bottom;                           /* y maximum */
  85.     } clip;                      
  86.     int galcol[MAX_GALAXIES];                 /* colors */
  87.     Matrix mat;                               /* Movement of stars(?) */
  88.     double scale;                             /* Scale */
  89.     int midx;                                 /* Middle of screen, x */
  90.     int midy;                                 /* Middle of screen, y */
  91.     double size;                              /* */
  92.     Vector diff;                              /* */
  93.     Galaxy galaxies[MAX_GALAXIES];            /* the Whole Universe */
  94.     double f_deltat;                          /* quality of calculation, calc'd by d_ideltat */
  95.     int f_galaxies;                           /* # galaxies */
  96.     int f_stars;                              /* # stars per galaxy */
  97.     int f_hititerations;                      /* # iterations before restart */
  98.     int step;                                 /* */
  99.     int init;                                 /* 1 -> re-initialize */
  100. #if (STARSIZE > 1)
  101.     int starsize;
  102. #endif
  103. } unistruct;
  104.  
  105. static unistruct universes[MAXSCREENS];
  106.  
  107. void
  108. initgalaxy(win)
  109.     Window      win;
  110. {
  111.     XWindowAttributes xwa;                        /* attributes of display */
  112.     unistruct *gp = &universes[screen];
  113.     int i;
  114.     
  115.     if (batchcount < 1)
  116.       batchcount = 1;
  117.     else if (batchcount > MAX_GALAXIES)
  118.       batchcount = MAX_GALAXIES;
  119.     gp->f_galaxies       = batchcount;
  120.     gp->f_stars          = MAX_STARS;
  121.     gp->f_hititerations  = MAX_HITITERATIONS;
  122.     gp->f_deltat         = ((double) MAX_IDELTAT)/10000.0;
  123.  
  124.     XGetWindowAttributes(dsp, win, &xwa);
  125. #ifdef BORDER
  126.     gp->clip.left    = xwa.border_width;
  127.     gp->clip.top     = xwa.border_width;
  128.     gp->clip.right   = xwa.width-2*xwa.border_width;
  129.     gp->clip.bottom  = xwa.height-2*xwa.border_width;
  130. #else
  131.     gp->clip.left    = 0;
  132.     gp->clip.top     = 0;
  133.     gp->clip.right   = xwa.width;
  134.     gp->clip.bottom  = xwa.height;
  135. #endif
  136.     gp->scale        = (double)(gp->clip.right)/4.0;
  137.     gp->midx         = gp->clip.right/2;
  138.     gp->midy         = gp->clip.bottom/2;
  139.     gp->init         = 1;
  140. #if (STARSIZE > 1)
  141.     gp->starsize   = STARSIZE;
  142. #endif
  143.  
  144.     if(!gp->galaxies[0].stars){
  145.     
  146.     for (i=0; i<MAX_GALAXIES; ++i) {
  147.         gp->galaxies[i].starscnt=0;    /* 0 valid entries */
  148.         gp->galaxies[i].stars=(Star *)malloc(gp->f_stars*sizeof(Star));
  149.     }
  150.     
  151.     }
  152. }
  153.  
  154.  
  155. void
  156. drawgalaxy(win)
  157.      Window      win;
  158. {
  159.     unistruct *gp = &universes[screen];
  160.     double d;                                  /* tmp */
  161.     int i, j, k;                               /* more tmp */
  162.  
  163.     if(gp->init){
  164.     double w1, w2, w3;                     /* more tmp */
  165.     double v,w, h;                         /* yet more tmp */
  166.  
  167.     gp->init=0;
  168.     gp->step=0;
  169.     
  170.     for (i=0; i<MAX_GALAXIES; ++i){
  171.         gp->galcol[i]=random() % COLORBASE;
  172.     }
  173.     
  174.     for (i=0; i<gp->f_galaxies; ++i) {
  175.         gp->galaxies[i].basecolor=gp->galcol[i];
  176.     
  177.         gp->galaxies[i].starscnt=(random() % (gp->f_stars/2))+gp->f_stars/2;
  178.     
  179.         w1=2.0*PI*FLOATRAND;
  180.         w2=2.0*PI*FLOATRAND;
  181.  
  182.         gp->mat[0][0]=         cos(w2);
  183.         gp->mat[0][1]=-sin(w1)*sin(w2);
  184.         gp->mat[0][2]= cos(w1)*sin(w2);
  185.         gp->mat[1][0]= 0.0;
  186.         gp->mat[1][1]= cos(w1);
  187.         gp->mat[1][2]= sin(w1);
  188.         gp->mat[2][0]=-        sin(w2);
  189.         gp->mat[2][1]=-sin(w1)*cos(w2);
  190.         gp->mat[2][2]= cos(w1)*cos(w2);
  191.     
  192.         gp->galaxies[i].vel[0]=FLOATRAND*2.0-1.0;
  193.         gp->galaxies[i].vel[1]=FLOATRAND*2.0-1.0;
  194.         gp->galaxies[i].vel[2]=FLOATRAND*2.0-1.0;
  195.         gp->galaxies[i].pos[0]=-gp->galaxies[i].vel[0]*gp->f_deltat*
  196.               gp->f_hititerations+FLOATRAND-0.5;
  197.         gp->galaxies[i].pos[1]=-gp->galaxies[i].vel[1]*gp->f_deltat*
  198.               gp->f_hititerations+FLOATRAND-0.5;
  199.         gp->galaxies[i].pos[2]=-gp->galaxies[i].vel[2]*gp->f_deltat*
  200.               gp->f_hititerations+FLOATRAND-0.5;
  201.     
  202.         gp->galaxies[i].mass=FLOATRAND*1000.0;
  203.     
  204.         /*w3=FLOATRAND;*/
  205.             w3 = 0.0;
  206.         gp->size=w3*w3*GALAKSIZE+0.1;
  207.     
  208.         for (j=0; j<gp->galaxies[i].starscnt; ++j) {
  209.         w=2.0*PI*FLOATRAND;
  210.         d=FLOATRAND*gp->size;
  211.         h=FLOATRAND*exp(-2.0*(d/gp->size))/5.0*gp->size;
  212.         if (FLOATRAND<0.5) h=-h;
  213.         gp->galaxies[i].stars[j].pos[0]=gp->mat[0][0]*d*cos(w)+
  214.                   gp->mat[1][0]*d*sin(w)+gp->mat[2][0]*h+gp->galaxies[i].pos[0];
  215.         gp->galaxies[i].stars[j].pos[1]=gp->mat[0][1]*d*cos(w)+gp->mat[1][1]*d*sin(w)+gp->mat[2][1]*h+gp->galaxies[i].pos[1];
  216.         gp->galaxies[i].stars[j].pos[2]=gp->mat[0][2]*d*cos(w)+gp->mat[1][2]*d*sin(w)+gp->mat[2][2]*h+gp->galaxies[i].pos[2];
  217.         
  218.         v=sqrt(gp->galaxies[i].mass*QCONS/sqrt(d*d+h*h));
  219.         gp->galaxies[i].stars[j].vel[0]=-gp->mat[0][0]*v*sin(w)+gp->mat[1][0]*v*cos(w)+gp->galaxies[i].vel[0];
  220.         gp->galaxies[i].stars[j].vel[1]=-gp->mat[0][1]*v*sin(w)+gp->mat[1][1]*v*cos(w)+gp->galaxies[i].vel[1];
  221.         gp->galaxies[i].stars[j].vel[2]=-gp->mat[0][2]*v*sin(w)+gp->mat[1][2]*v*cos(w)+gp->galaxies[i].vel[2];
  222.         
  223.         gp->galaxies[i].stars[j].color=COLORSTEP*gp->galaxies[i].basecolor+j%COLORSTEP;
  224.         
  225.         gp->galaxies[i].stars[j].px=0;
  226.         gp->galaxies[i].stars[j].py=0;
  227.         }
  228.     }
  229.     
  230.     XSetForeground(dsp,Scr[screen].gc,BlackPixel(dsp, screen));
  231.     XFillRectangle(dsp,win,Scr[screen].gc,gp->clip.left,gp->clip.top,gp->clip.right,gp->clip.bottom);
  232.  
  233. #if 0
  234.     printf("f_galaxies=%d, f_stars=%d, f_hititerations=%d\n", gp->f_galaxies, gp->f_stars, gp->f_hititerations);
  235.     printf("f_deltat=%g\n", gp->f_deltat);
  236.     printf("Screen: ");
  237.     printf("%dx%d pixel (%d-%d, %d-%d)\n",
  238.            (gp->clip.right-gp->clip.left),(gp->clip.bottom-gp->clip.top),
  239.            gp->clip.left,
  240.            gp->clip.right,
  241.            gp->clip.top,
  242.            gp->clip.bottom);
  243. #endif /*0*/
  244.     }
  245.     
  246.     for (i=0; i<gp->f_galaxies; ++i){
  247.     for (j=0; j<gp->galaxies[i].starscnt; ++j) {
  248.         for (k=0; k<gp->f_galaxies; ++k) {
  249.         gp->diff[0]=gp->galaxies[k].pos[0]-gp->galaxies[i].stars